Ленивый ML с π-calculus в 26КБ

Написал ленивый Эрланг (:

./ml.exe spawn.ml Synrc ML Jun 2012 let rec run = lambda nn. output ! spawn let rec from = lambda n. output ! n -> if n = 1 then stop else from n - 1 in from 10 -> if nn = 1 then stop else run nn - 1 in run 3000000 2 processes left 36000001 evals, procs: 3000000 6000007 env cells used, 0 cells used execution time: 3.05s

Создание 3 миллионов потоков занимает 3 секунды. Потоки выводят числа от 1 до 10. но поскольку вывод отключен и ленивость то это отрабатывает за 3 секунды. Если отключить ленивость то 5 тыс процессов отрабатывают вывод в канал за 2 секунды. Надо быстрее!

Решето Эратосфена

let rec from = lambda n. fromchan ! n -> if n = 10 then stop else from (n+1), fromchan = chan, sieve = lambda inch. inch ? p -> output ! p -> let rec filter = inch?x -> if (x/p) * p <> x then connect!x -> filter else filter, connect = chan in (filter || sieve connect) in from 2 || sieve fromchan

Реверс масива

let rec reverse = lambda L. let rec rev = lambda inp. lambda op. if null inp then op else rev tail inp head inp :: op in rev L nil, L1 = 1 :: 3 :: 5 :: 7 :: 9 :: 11 :: nil, L2 = reverse L1 in output ! L2 -> stop

[2]. Namda Tonpa. Lazy ML interpreter with π-calculus in 26KB. Github Sources.